﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using prjKQXS_DLL;
using prjKQXS_DLL.Danh_muc;

namespace prjKQXS_UI.View
{
    public partial class frmNhatKyChuyenDL : XtraForm
    {
        Color defaultColor; //biến này để lưu lại gvDonVi.Appearance.FocusedRow.BackColor
        
        #region form EVENT =======================================================================
        public frmNhatKyChuyenDL()
        {
            InitializeComponent();
        }

        private void frmNhatKyChuyenDL_Load(object sender, EventArgs e)
        {
            defaultColor = gvDL.Appearance.FocusedRow.BackColor;
            loadData();
        }

        private void frmNhatKyChuyenDL_Shown(object sender, EventArgs e)
        {
            cbtnSua.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_SuaNhatKyChuyenDaiLy);
        }

        private void frmNhatKyChuyenDL_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (frmMain.sEdittingFormName.Contains(this.Name))
            {
                string msg = "Bạn đang chỉnh sửa cán bộ nhưng dữ liệu chưa được lưu.\n" +
                    "Bạn vẫn muốn đóng cửa sổ này?";
                if (MessageBox.Show(msg, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else
                {
                    gvDL.CancelUpdateCurrentRow();
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    this.Close();
                }
            }
        }
        #endregion form EVENT ====================================================================

        
        #region Control ==========================================================================
        private void cbtnSua_CheckedChanged(object sender, EventArgs e)
        {
            if (cbtnSua.Checked)
            {
                cbtnSua.Text = "Khóa";
            }
            else
            {
                chkKhoiPhuc.Checked = false;
                cbtnSua.Text = "Sửa";
                loadData();
            }

            if (gvDL.GetDataRow(GridControl.NewItemRowHandle) != null) //Nếu có dòng đang thêm mới trong gvDonVi
            {
                loadData();
            }

            sbtnXoa.Enabled = cbtnSua.Checked;
            gvDL_DataSourceChanged(sender, e);
            chkKhoiPhuc.Enabled = cbtnSua.Checked;
            gvDL.OptionsBehavior.Editable = cbtnSua.Checked;
        }

        private void sbtnXoa_Click(object sender, EventArgs e)
        {
            clsChuyenDL cls = new clsChuyenDL();
            cls.OnAction += new clsChuyenDL.OnActionHandler(cls_OnAction);
            cls.OnError += new clsChuyenDL.OnErrorHandler(cls_OnError);

            if (chkKhoiPhuc.Checked)
            {
                if (gcDL.DataSource != null
                    && ((DataTable)gcDL.DataSource).Rows.Count > 0)
                {
                    string s = "Ở chế độ khôi phục sẽ bị xóa hoàn toàn khỏi hệ thống.\n" +
                        "Bạn có chắc chắn xóa dòng này?";
                    if (clsCommon.MsgBox(s, 2) == DialogResult.Yes)
                    {
                        cls.Delete((int)gvDL.GetFocusedDataRow()["ID"], false);
                    }
                }
            }
            else
            {
                if (gcDL.DataSource != null && ((DataTable)gcDL.DataSource).Rows.Count > 0)
                {
                    if (clsCommon.MsgBox("Bạn có chắc chắn muốn xóa cán bộ này?", 2) == DialogResult.Yes)
                    {
                        cls.Delete((int)gvDL.GetFocusedDataRow()["ID"], true);
                    }
                }
            }
            loadData();
        }

        private void sbtnLoc_Click(object sender, EventArgs e)
        {
            if (sbtnLoc.Tag.Equals("LOC"))
            {
                sbtnLoc.Tag = "BL";
                sbtnLoc.Text = "&Bỏ lọc";
                gvDL.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvDL.OptionsView.ShowAutoFilterRow = false;
                sbtnLoc.Tag = "LOC";
                sbtnLoc.Text = "&Lọc";
                gvDL.ClearColumnsFilter();
            }
        }

        private void chkKhoiPhuc_CheckedChanged(object sender, EventArgs e)
        {
            if (chkKhoiPhuc.Checked) gvDL.OptionsBehavior.Editable = false;
            else gvDL.OptionsBehavior.Editable = cbtnSua.Checked;

            //load_rilueDaiLyCu();
            loadData();

        }

        private void sbtnKhoiPhuc_Click(object sender, EventArgs e)
        {
            if (XtraMessageBox.Show("Bạn có chắc chắn muốn khôi phục dòng này?", 
                "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                clsChuyenDL cls = new clsChuyenDL();
                cls.OnAction += new clsChuyenDL.OnActionHandler(cls_OnAction);
                cls.OnError += new clsChuyenDL.OnErrorHandler(cls_OnError);

                cls.Restore((int)gvDL.GetFocusedDataRow()["ID"]);
                loadData();
            }
        }

        private void sbtnDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void gvDL_DataSourceChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = gvDL.RowCount.ToString();

            if (gvDL.RowCount == 0)
            {
                sbtnXoa.Enabled = false;
                chkKhoiPhuc.Enabled = cbtnSua.Checked;
                sbtnKhoiPhuc.Enabled = false;
            }
            else
            {
                gvDL.ClearColumnErrors();
                sbtnXoa.Enabled = cbtnSua.Checked;
                sbtnKhoiPhuc.Enabled = chkKhoiPhuc.Checked;
            }
        }

        private void gvDL_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            this.Text = this.Text.Replace("*", "");
            this.Text += "*";

            gvDL.Appearance.FocusedRow.BackColor = frmMain.InvalidExceptionColor;
            frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            frmMain.sEdittingFormName += this.Name;
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void gvDL_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            DataRow dr = gvDL.GetDataRow(e.RowHandle);
            if (dr != null)
            {
                e.Valid = RecordIsOK(dr);

                if (e.Valid) // Nếu dữ liệu nhập vào hợp lệ thì thực hiện lưu
                {
                    clsChuyenDL cls = new clsChuyenDL();
                    cls.OnAction += new clsChuyenDL.OnActionHandler(cls_OnAction);
                    cls.OnError += new clsChuyenDL.OnErrorHandler(cls_OnError);

                    cls.Update(dr);
                    gvDL.Appearance.FocusedRow.BackColor = defaultColor;
                    this.Text = this.Text.Replace("*", "");
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    loadData();  //nạp lại dữ liệu để cập nhật giá trị id cho dòng vừa thêm mới
                }
            }
        }
        #endregion Control =======================================================================


        #region Sub and Func =====================================================================
        #region cls event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion ---------------------------------------------------------

        private void loadData()
        {
            clsChuyenDL cls = new clsChuyenDL();
            cls.OnAction += new clsChuyenDL.OnActionHandler(cls_OnAction);
            cls.OnError += new clsChuyenDL.OnErrorHandler(cls_OnError);

            DataTable dt = cls.loadData(chkKhoiPhuc.Checked);
            gcDL.DataSource = dt;
        }

        private void enableControl(bool enabled)
        {
            sbtnXoa.Enabled = enabled;
            sbtnLoc.Enabled = enabled;
            chkKhoiPhuc.Enabled = enabled;
        }

        private bool RecordIsOK(DataRow dr)
        {
            bool ok = true;
            string msg;
            //KIỂM TRA NGÀY CHUYỂN
            //- Ngày chuyển phải sau ngày hợp đồng và trước ngày hiện tại
            DateTime NgayChuyen = ((DateTime)dr["TuNgay"]).Date;
            DateTime NgayHD = ((DateTime)dr["Ngay_HD"]).Date;
            if (NgayChuyen < NgayHD 
                || NgayChuyen > DateTime.Now.Date)
            {
                ok = false;
                msg = "NGÀY CHUYỂN phải sau ngày hợp đồng và trước ngày hiện tại.";
                gvDL.SetColumnError(gcolNgayChuyen, msg);
            }
            else if (!clsChuyenDL.checkNgay(NgayChuyen, (int)dr["HopDongID"]))    //Nếu vào ngày NgayChuyen, HopDongID đã xảy ra việc chuyển
            {
                ok = false;
                msg = "Cùng một hợp đồng không được chuyển 2 lần trong cùng 1 ngày.";
                gvDL.SetColumnError(gcolNgayChuyen, msg);
            }

            return ok;
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                gvDL.CancelUpdateCurrentRow();
                enableControl(true);

                gvDL.Appearance.FocusedRow.BackColor = defaultColor;
                this.Text = this.Text.Replace("*", "");
                frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }
        #endregion Sub and Func ==================================================================
    }
}